//package com.tianji.remark.service.impl;
//
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.tianji.api.dto.msg.LikedTimesDTO;
//import com.tianji.common.autoconfigure.mq.RabbitMqHelper;
//import com.tianji.common.utils.StringUtils;
//import com.tianji.common.utils.UserContext;
//import com.tianji.remark.domain.dto.LikeRecordFormDTO;
//import com.tianji.remark.domain.po.LikedRecord;
//import com.tianji.remark.mapper.LikedRecordMapper;
//import com.tianji.remark.service.ILikedRecordService;
//import lombok.RequiredArgsConstructor;
//
//import java.util.Collections;
//import java.util.List;
//import java.util.Set;
//import java.util.stream.Collectors;
//
//import static com.tianji.common.constants.MqConstants.Exchange.LIKE_RECORD_EXCHANGE;
//import static com.tianji.common.constants.MqConstants.Key.LIKED_TIMES_KEY_TEMPLATE;
//
///**
// * <p>
// * 点赞记录表 服务实现类
// * </p>
// *
// * @author zr
// * @since 2024-07-18
// */
////@Service
//@RequiredArgsConstructor
//public class LikedRecordServiceImpl extends ServiceImpl<LikedRecordMapper, LikedRecord> implements ILikedRecordService {
//
//    private final RabbitMqHelper mqHelper;
//    /**
//     * 添加点赞记录。
//     * <p>
//     * 该方法用于接收一个点赞记录的DTO对象，并将其添加到系统的点赞记录中。
//     * 主要用于记录用户的点赞行为，以便后续的数据分析和用户行为追踪。
//     *
//     * @param recordDTO 点赞记录的DTO对象，包含了点赞的详细信息，如点赞用户ID、被点赞内容ID等。
//     */
//    @Override
//    public void addLikeRecord(LikeRecordFormDTO recordDTO) {
//        // 1.基于前端的参数，判断是执行点赞还是取消点赞
//        boolean success = recordDTO.getLiked() ? like(recordDTO) : unlike(recordDTO);
//        // 2.判断是否执行成功，如果失败，则直接结束
//        if (!success) {
//            return;
//        }
//        // 3.如果执行成功，统计点赞总数
//        Integer likedTimes = lambdaQuery()
//                .eq(LikedRecord::getBizId, recordDTO.getBizId())
//                .count();
//        // 4.发送MQ通知
//        mqHelper.send(
//                LIKE_RECORD_EXCHANGE,
//                StringUtils.format(LIKED_TIMES_KEY_TEMPLATE, recordDTO.getBizType()),
//                LikedTimesDTO.of(recordDTO.getBizId(), likedTimes));
//    }
//
//    private boolean unlike(LikeRecordFormDTO recordDTO) {
//        LikedRecord one = this.lambdaQuery()
//                .eq(LikedRecord::getUserId, UserContext.getUser())
//                .eq(LikedRecord::getBizId, recordDTO.getBizId())
//                .one();
//        //没有点过赞，取消点赞失败
//        if(one == null){
//            return false;
//        }
//        //点过赞，删除该点赞记录
//        return this.removeById(one);
//    }
//
//    private boolean like(LikeRecordFormDTO recordDTO) {
//        Long userId = UserContext.getUser();
//        // 1.查询点赞记录
//        Integer count = lambdaQuery()
//                .eq(LikedRecord::getUserId, userId)
//                .eq(LikedRecord::getBizId, recordDTO.getBizId())
//                .count();
//        // 2.判断是否存在，如果已经存在，直接结束
//        if (count > 0) {
//            return false;
//        }
//        // 3.如果不存在，直接新增
//        LikedRecord r = new LikedRecord();
//        r.setUserId(userId);
//        r.setBizId(recordDTO.getBizId());
//        r.setBizType(recordDTO.getBizType());
//        return save(r);
//    }
//
//    /**
//     * 判断指定业务ID是否被点赞。
//     * <p>
//     * 本函数通过查询点赞记录，确定给定的业务ID是否曾被点赞。点赞记录以集合形式返回，
//     * 包含所有被点赞的业务ID。未被点赞的业务ID不会出现在返回的集合中。
//     *
//     * @param bizIds 业务ID的列表，代表需要查询点赞状态的业务项。
//     * @return 返回一个集合，包含所有被点赞的业务ID。如果某个业务ID未被点赞，则不会出现在集合中。
//     */
//    @Override
//    public Set<Long> isBizLiked(List<Long> bizIds) {
//        if(bizIds.isEmpty()){
//            return Collections.emptySet();
//        }
//        // 1.获取登录用户id
//        Long userId = UserContext.getUser();
//        // 2.查询点赞状态
//        List<LikedRecord> list = lambdaQuery()
//                .in(LikedRecord::getBizId, bizIds)
//                .eq(LikedRecord::getUserId, userId)
//                .list();
//        // 3.返回结果
//        return list.stream().map(LikedRecord::getBizId).collect(Collectors.toSet());
//    }
//
//    /**
//     * 读取redis点赞次数并发送消息。
//     * 此方法用于根据特定业务类型，读取点赞次数，并发送相关消息。
//     * 主要应用于需要根据点赞数触发某些操作或通知的场景。
//     *
//     * @param bizType    业务类型标识。用于区分不同的业务场景。
//     * @param maxBizSize redis取出业务数最大值。
//     */
//    @Override
//    public void readLikedTimesAndSendMessage(String bizType, int maxBizSize) {
//
//    }
//
//
//}
